package com.cy.pj.sys.pojo.web.controller;

import com.cy.pj.common.util.PageUtil;
import com.cy.pj.sys.pojo.pojo.SysNotice;
import com.cy.pj.sys.pojo.service.SysNoticeService;
import com.cy.pj.sys.pojo.web.pojo.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 这个类我们称之为控制层对象的处理器(Handler),通过此对象处理
 * DispatcherServlet(核心控制器-Controller)分发的请求,具体的
 * 处理包括:
 *  1.定义url请求
 *  2.通过参数对象封装请求参数数据
 *  3.调用业务方法处理业务逻辑
 *  4.封装处理结果交给DispatcherServlet进行处理
 *  restful风格url 对于notice模块而言
 *  查询操作： @GetMaping     /notice/
 *  * 添加操作： @PostMapping   /notice/
 *  * 修改操作:  @PutMapping    /notice/
 *  * 删除操作:  @DeleteMapping /notice/{id}
 *  * 基于id查找 @GetMapping    /notice/{id}
 */
//交给spring去管理
@RestController//等同于@Controller+@ResponseBody
@RequestMapping("/notice/")//模块名
//@ResponseBody
//@Controller
//当你的客户端的请求方式与你的服务端的可以处理的请求不匹配时就是405的异常
@ResponseBody
public class SysNoticeController {
    @Autowired
    private SysNoticeService sysNoticeService;
//此方法会由DispatcherServlet(controller)对象通过反射进行调用
    //dispatcherServlet拿到请求中参数时会将参数注入给反射调用的方法参数
    //把request请求换成get请求第一种方法
    //@RequestMapping(value="/doFindNotices",method = RequestMethod.GET)
    //第二中方法
    //查询所有
    @GetMapping
    @ResponseBody
    public JsonResult doFindNotices(SysNotice notice){
      PageUtil.startPage();
        return new JsonResult(sysNoticeService.findNotices(notice));
        //字符串传唤为对象是反序列话/翻过来就是序列话
        //此方法的返回值会交给DispatcherServlet
        //假如方法有 @ResponseBody注解修饰DispatcherServlet会调用jackson qpi将方法的返回值转换为json格式字符串
       //底层转换时会调用返回值对象的get方法.以get方法的方法名(去掉get单词)为key,
        // get方法的返回值为value来构建json字符串
    }

    /**
     *   // @RequestMapping(value="/doSaveNotice",method = RequestMethod.POST)
     *     //添加
     * 假如方法参数使用了@RequestBody描述,客户端数据的提交要求:
     * 1.提交方式:post
     * 2.请求Content-Type设计:application/json
     * 3.请求数据格式{"key1":"v1","key2":2,.....}
     * @param notice
     * @return
     */
    @PostMapping
    public  JsonResult doSaveNotice(@RequestBody SysNotice notice){
       // try{
            sysNoticeService.saveNotice(notice);
//        }catch (Throwable e){
//            return new JsonResult(e);
//        }
        //System.out.println("save ok");
        return new JsonResult ("save ok");
    }

    /**
     * 基于id查询notice对象
     * 普通方式的url
     * http://ip:port/notice/doFindById?id=14
     * @param id
     * @return
     * rest风格的url(软件架构编码风格),允许在url中基于{}方式定义变量,基于{}进行实现
     * rest风格应用目的:第一跨服务端,2.通用url设计,让url的设计更加通用和简单
     * 方法参数的值假如来自url中{var}变量的值,则需要使用@PathVariable注解对参数进行
     */
    //查询
    @GetMapping("{id}")
    @ResponseBody
    //查询调用的是data,查询的结果赋值给data属性
    //rest风格的url是需要加上@PathVariable这个注解如果不加就是普通的url
    public  JsonResult doFindById(@PathVariable Long id){
    return new JsonResult(sysNoticeService.findById(id));
    }
  //修改

    @PutMapping
    @ResponseBody

    public  JsonResult doUpdateNotice(SysNotice notice){
        sysNoticeService.updateNotice(notice);
        return new JsonResult("update ok");
    }
    //删除
    @DeleteMapping("{ids}")
    @ResponseBody
    public  JsonResult doDeleteById(@PathVariable Long... ids){
        sysNoticeService.deleteById(ids);
        return new JsonResult("delete ok");
    }


}
/**
 * 请求响应处理
 * 1.请求url的定义(普通风格的url,rest风格的url)
 * 2.请求方式的设计(@GetMapping,@PostMapping,@DeleteMapping,@PutMapping,@RequestMapping)
 * 3.请求参数类型设计(直接量(就是8种基本数据类型,字符串,数组,id都是直接量),pojo对象去接受参数)
 * 4.请求方法参数的修饰(@PathVariable-从url中取数据,@RequestBody-告诉服务端接收json数据,@RequestParam-对传统请求参数进行约束)
 * 响应数据
 * 1.响应标准设计
 * 2.响应数据转换(json格式数据)
 * 3.统一异常的处理()
 */
/**
 *Spring工厂模式说明
 * BeanFactory顶级接口
 * FactoryBean业务接口
 */
/**
 *一个方法当中这一个有多个参数的话只能有一个参数使用@RequestBody其他的是不可以的
 * 以后只要是post请求或put请求尽量用Json格式数据
 */